﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using AudiPyme.BLL;
using System.IO;
using System.Data;
using AudiPyme.DAL;
using System.Web.UI.DataVisualization;
using System.Web.UI.DataVisualization.Charting;
using System.Drawing;
using System.Web.UI.HtmlControls;

namespace AudiPyme.UI
{

    public partial class ActivosPrincipal : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                if (EmpresaUsuario != 0)
                {
                    int numeroActivosEmpresa = ActivosEmpresaFactory.NumeroTotalesActivosEmpresa(EmpresaUsuario);
                    GeneraOpciones(EmpresaUsuario, numeroActivosEmpresa);
                    //Si la empresa tiene activos, mostramos los chart
                    if (numeroActivosEmpresa != 0)
                    {
                        PanelOpcClasif.Visible = true;
                        PanelChart.Visible = true;
                        //Inicialmente se muestra el Chart con los activos agrupados por Tipo de Activo
                        PintaChart("TipoActivo", null);
                    }
                    else
                    {
                        MuestraMensaje("No hay activos actualmente en la base de datos para la empresa");
                    }
                }
                else
                {
                    MuestraMensaje("No hay una empresa asociada al usuario " + NombreUsuario);
                }
            }

        }

        private void GeneraOpciones(int EmpresaUsuario, int NumeroActivosEmpresa)
        {
            if (EmpresaUsuario != 0)
            {
                //Añado la opcion Añadir Activos
                HtmlGenericControl opc1 = new HtmlGenericControl("li");
                ListaOpciones.Controls.Add(opc1);
                HtmlGenericControl anchor = new HtmlGenericControl("a");
                anchor.Attributes.Add("href", "ActivosAdd.aspx");
                anchor.InnerText = "Añadir Activos";
                opc1.Controls.Add(anchor);
            }
            //Si hay algun activo de la Empresa
            if (NumeroActivosEmpresa != 0)
            {
                //Añade la opcion de gestionar activos
                HtmlGenericControl opc1 = new HtmlGenericControl("li");
                ListaOpciones.Controls.Add(opc1);
                HtmlGenericControl anchor = new HtmlGenericControl("a");
                anchor.Attributes.Add("href", "ActivosConsulta.aspx");
                anchor.InnerText = "Gestionar Activos";
                opc1.Controls.Add(anchor);
            }

        }

        protected void Chart1_Click(object sender, ImageMapEventArgs e)
        {
            //Recogemos la opción elegida en el DropDownList
            String opcion = DdlActivos.SelectedValue;
            //Si hubiera una fila seleccionada para editar la deseleccionamos
            GVActivosEmpresa.EditIndex = -1;
            //Recogemos el valor seleccionados en el chart: un Tipo de Activo o un Valor Estratégico
            String Parametro = e.PostBackValue;
            //Actualizamos el Label según el la columna del chart elegido
            LblTipoActivo.Text = Parametro;
            //Si la opción elegida en el Ddl es Coste de Activo, tenemos que tener en cuenta los Rangos elegidos
            if (opcion.Equals("CosteActivo"))
            {
                //Se recoge los rangos elegidos
                List<int> Rangos = RecogeDdlRangos();
                //Se pincha el Chart de acuerdo a esos rangos
                PintaChart(opcion, Rangos);
                //Se llena el Gridview
                LlenaGridView(opcion);
            }
            //Si no es la opción Coste de Activo, no existen rangos, luego no se tienen en cuenta
            else
            {
                PintaChart(opcion, null);
                LlenaGridView(opcion);
            }
        }

        protected void GVActivosEmpresa_RowEditing(object sender, GridViewEditEventArgs e)
        {
            //Seleccionamos la fila seleccionada
            GVActivosEmpresa.EditIndex = e.NewEditIndex;
            //Recogemos el tipo de ordenación de los activos seleccionado en DdlActivos
            String opcion = DdlActivos.SelectedValue;
            //Actualizamos el Chart y el GridView con la opción elegida
            //Si la opción elegida en el Ddl es Coste de Activo, tenemos que tener en cuenta los Rangos elegidos
            if (opcion.Equals("CosteActivo"))
            {
                List<int> Rangos = RecogeDdlRangos();
                //PintaChart(opcion, Rangos);
                LlenaGridView(opcion);
            }
            //Si no es la opción Coste de Activo, no existen rangos, luego no se tienen en cuenta
            else
            {
                //PintaChart(opcion, null);
                LlenaGridView(opcion);
            }
        }

        protected void GVActivosEmpresa_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            //Deseleccionamos la fila
            GVActivosEmpresa.EditIndex = -1;
            //Recogemos el tipo de ordenación de los activos seleccionado en DdlActivos
            String opcion = DdlActivos.SelectedValue;
            //Actualizamos el Chart y el GridView con la opción elegida
            //Si la opción elegida en el Ddl es Coste de Activo, tenemos que tener en cuenta los Rangos elegidos
            if (opcion.Equals("CosteActivo"))
            {
                List<int> Rangos = RecogeDdlRangos();
                //PintaChart(opcion, Rangos);
                LlenaGridView(opcion);
            }
            //Si no es la opción Coste de Activo, no existen rangos, luego no se tienen en cuenta
            else
            {
                //PintaChart(opcion, null);
                LlenaGridView(opcion);
            }
        }

        protected void GVActivosEmpresa_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            try
            {
                //Comprobamos que los datos introducidos pasan el validador
                List<int> Rangos = new List<int>();
                String opcion = DdlActivos.SelectedValue;
                //Si los pasan
                Page.Validate("Validador");
                if (Page.IsValid)
                {
                    //Recogemos la empresa asociada al usuario que inició la sesión
                    String NombreUsuario = (String)Session["nombreUsuario"];
                    int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                    //Recogemos la fila seleccionada para editar
                    GridViewRow row = GVActivosEmpresa.Rows[e.RowIndex];
                    //Recogemos el DropDownList Valor de la fila seleccionada
                    DropDownList DdlValor = (DropDownList)row.FindControl("DdlValor");
                    //Recogemos el TextBox Nombre de la fila seleccionada
                    TextBox TxtNombre = (TextBox)row.FindControl("TxtNombre");
                    String NombreActivo = TxtNombre.Text;
                    //Recogemos el TextBox Coste de la fila seleccionada
                    TextBox TxtCoste = (TextBox)row.FindControl("TxtCoste");
                    //Recogemos el Tipo de Activo seleccionado en el Chart a través del Label
                    String TipoActivo = LblTipoActivo.Text;
                    //Buscamos el Id del Tipo de Activo seleccionado
                    int IdTipoActivo = TiposActivosFactory.BuscarIdTipoActivo(TipoActivo);
                    //Convertirmos los valores en enteros para almacenarlos en la BD
                    int Coste = int.Parse(TxtCoste.Text);
                    int Valor = int.Parse(DdlValor.SelectedValue);
                    //Comprobamos que se han introducido datos correctos
                    if (Coste > 0 && Valor > 0)
                    {
                        //Recogemos el Id del Activo Seleccionado
                        int IdActivo = Int32.Parse(GVActivosEmpresa.Rows[row.RowIndex].Cells[0].Text);
                        e.Cancel = true;
                        GVActivosEmpresa.EditIndex = -1;
                        //Actualizo el activo seleccionado con los valores elegidos
                        ActivosEmpresaFactory.ActualizarActivoEmpresa(EmpresaUsuario, IdActivo, NombreActivo, Coste, Valor);
                        //Actualizo los valores del chart y del gridview sea cual fuere la rama elegida
                        opcion = DdlActivos.SelectedValue;
                        //Si la opción elegida en el Ddl es Coste de Activo, tenemos que tener en cuenta los Rangos elegidos
                        if (opcion.Equals("CosteActivo"))
                        {
                            Rangos = RecogeDdlRangos();
                            PintaChart(opcion, Rangos);
                            LlenaGridView(opcion);
                        }
                        //Si no es la opción Coste de Activo, no existen rangos, luego no se tienen en cuenta
                        else
                        {
                            PintaChart(opcion, null);
                            LlenaGridView(opcion);
                        }
                        MuestraMensaje("El Activo se ha actualizado correctamente");
                    }
                    //Si no, estamos ante una de las condiciones de error
                    else
                    {
                        //Si el coste es negativo lanzo un mensaje de error
                        if (Coste <= 0)
                        {
                            MuestraMensaje("El Coste tiene que ser mayor que 0. No se actualizará el activo");
                        }
                        //Si no se ha elegido un valor estratégico se lanza un mensaje de error
                        else if (Valor == 0)
                        {
                            MuestraMensaje("Elija un Valor Estratégico de la lista");
                        }
                        //Actualizamos el Chart y el GV con cualquiera de las opciones que hayan sucedido
                        //Si estábamos en la opción de CosteActivo
                        if (opcion.Equals("CosteActivo"))
                        {
                            Rangos = RecogeDdlRangos();
                            PintaChart(opcion, Rangos);
                            //LlenaGridView(opcion);
                        }
                        //Si estábamos en las otras opciones
                        else
                        {
                            PintaChart(opcion, null);
                            //LlenaGridView(opcion);
                        }
                    }
                }
                //Si no pasó la validación es porque se introdujo un valor no numérico. Se muestra el error.
                else
                {
                    GridViewRow row = GVActivosEmpresa.Rows[e.RowIndex];
                    //Recogemos el TextBox Nombre de la fila seleccionada
                    TextBox TxtNombre = (TextBox)row.FindControl("TxtNombre");
                    //Recogemos el TextBox Coste de la fila seleccionada
                    TextBox TxtCoste = (TextBox)row.FindControl("TxtCoste");
                    if (TxtNombre.Text.Trim().Equals(""))
                        MuestraMensaje("Indique un nombre para el activo");
                    else
                        MuestraMensaje("Indique una cantidad numérica positiva.");
                    //Deseleccionamos la fila de GV para devolverla a su estado anterior
                    //GVActivosEmpresa.EditIndex = -1;

                    //Actualizamos el Chart y el GV
                    //Si estábamos en la opción de CosteActivo
                    if (opcion.Equals("CosteActivo"))
                    {
                        Rangos = RecogeDdlRangos();
                        PintaChart(opcion, Rangos);
                    }
                    else
                    {
                        PintaChart(opcion, null);
                    }
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("No se pudieron actualizar los activos");
            }
        }

        //Método para scara por pantalla un Mensaje de información
        protected void MuestraMensaje(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "showalert", SB.ToString(), true);
        }

        //Método que muestra información según el tipo de clasifación elegida para los activos
        protected void DdlActivos_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Recogemos la empresa asociada al usuario que inició la sesión
            String NombreUsuario = (String)Session["nombreUsuario"];
            int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
            String opcion = DdlActivos.SelectedValue;
            LblOpcion.Text = opcion;
            //Ponemos el label a vacío por si veníamos de otra opción
            LblTipoActivo.Text = "";
            //Bindeamos el GridView a null para que si saltamos de clasificación no se nos muestre el GV anterior
            GVActivosEmpresa.DataSource = null;
            DataBind();
            UpdatePanel3.Update();
            //Ponemos el Panel de Rangos Visible a False
            PnlRangos.Visible = false;
            //Si la opción es CosteActivo mostramos el Panel para que elijan los rangos de clasificación
            if (opcion == "CosteActivo")
            {
                LblOpcion.Text = "Coste del Activo";
                PnlRangos.Visible = true;
                Chart1.Visible = false;
                UpdatePanel2.Update();
            }
            //Sino pintamos directamente el chart con la opción elegida
            else
            {
                PintaChart(opcion, null);
            }
        }

        //Método que muestra la información elegida en un chart
        private void PintaChart(String opcion, List<int> Rangos)
        {
            try
            {
                //Recogemos la empresa asociada al usuario que inició la sesión
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                //Seteamos el chart a visible por si venimos de una condición de error
                Chart1.Visible = true;
                switch (opcion)
                {
                    //Dependiendo de la opcion elegida en el DropDownList, el Chart mostrará los activos 
                    //agrupados según el criterio seleccionado
                    case "TipoActivo":
                        LblOpcion.Text = "Tipo de Activo";
                        List<String> TiposActivos = TiposActivosFactory.ListaTiposActivos();
                        List<int> LNumActTipActEmp = TiposActivosFactory.NumActivosTipActivoEmpresa(EmpresaUsuario);
                        if (HayActivos(LNumActTipActEmp))
                        {
                            PanelChart.Visible = true;
                            for (int i = 0; i < TiposActivos.Count(); i++)
                            {
                                //Si tenemos algún activo actual con ese tipo de activo lo pintamos.
                                if (LNumActTipActEmp[i] != 0)
                                {
                                    Chart1.Series["Series1"].Points.AddXY(TiposActivos[i], LNumActTipActEmp[i]);
                                }
                            }
                            this.Chart1.Series["Series1"].ToolTip = "Número de Activos de Tipo #AXISLABEL : #VALY. Pinche aquí para ver estos activos";
                        }
                        else
                        {
                            MuestraMensaje("No hay activos definidos para la empresa");
                            PanelChart.Visible = false;
                        }
                        break;
                    case "ValorActivo":
                        LblOpcion.Text = "Valor Estrategico";
                        List<int> ActivosPorValor = ActivosEmpresaFactory.ActivosEmpresaPorValor(EmpresaUsuario);
                        List<String> TipoValores = ActivosEmpresaFactory.TiposValorEstrategico();
                        if (HayActivos(ActivosPorValor))
                        {
                            PanelChart.Visible = true;
                            for (int i = 0; i < TipoValores.Count(); i++)
                            {
                                //Si hay activos con un valor dado se pinta.
                                if (ActivosPorValor[i] != 0)
                                {
                                    Chart1.Series["Series1"].Points.AddXY(TipoValores[i], ActivosPorValor[i]);
                                }
                            }
                            this.Chart1.Series["Series1"].ToolTip = "Numero de Activos con Valor Estratégico #AXISLABEL : #VALY. Pinche aquí para ver estos activos";
                        }
                        else
                        {
                            MuestraMensaje("No hay activos definidos para la empresa");
                            PanelChart.Visible = false;
                        }
                        break;
                    case "CosteActivo":
                        Chart1.Visible = true;
                        LblOpcion.Text = "Coste del Activo";
                        List<int> ActivosPorCoste = ActivosEmpresaNegocio.ActivosEmpresaPorCoste(EmpresaUsuario, Rangos);
                        List<String> ValoresRangos = RecogeRangos(Rangos);
                        //Fallo en el método ActivosEmpresaPorCoste. Mostramos el Error
                        if (ActivosPorCoste == null)
                        {
                            MuestraMensaje("Error.No se pudieron recoger los activos por Coste");
                            Chart1.Visible = false;
                        }
                        //Si todo va bien, pintamos el chart con los datos recogidos
                        else
                        {
                            if (HayActivos(ActivosPorCoste))
                            {
                                PanelChart.Visible = true;
                                for (int i = 0; i < ActivosPorCoste.Count(); i++)
                                {
                                    //Aquí si que pintamos los rangos aunque no tengan activos en ese intervalo
                                    //porque es a petición del usuario
                                    Chart1.Series["Series1"].Points.AddXY(ValoresRangos[i], ActivosPorCoste[i]);
                                }
                                this.Chart1.Series["Series1"].ToolTip = "Numero de Activos con Coste #AXISLABEL : #VALY. Pinche aquí para ver estos activos";
                            }
                            else
                            {
                                MuestraMensaje("No hay activos definidos para la empresa");
                                PanelChart.Visible = false;
                            }
                        }
                        break;
                }
                //Transparencia a las barras del chart
                Chart1.ApplyPaletteColors();
                foreach (var serie in Chart1.Series)
                    serie.Color = Color.FromArgb(220, serie.Color);
                UpdatePanel2.Update();
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar el gráfico");
            }
        }

        private bool HayActivos(List<int> ListaActivos)
        {
            bool hay = false;
            for (int i = 0; i < ListaActivos.Count(); i++)
            {
                if (ListaActivos[i] != 0)
                {
                    hay = true;
                    return hay;
                }
            }
            return hay;
        }

        private void LlenaGridView(String opcion)
        {
            try
            {
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                //Dependiendo de la opcion elegida en el DropDownList y de la barra elegida en el Chart el GridView mostrará los activos 
                //agrupados según la opción seleccionada y filtrados según la barra del Chart elegida
                switch (opcion)
                {
                    case "TipoActivo":
                        //Recojo el valor del tipo de activo seleccionado en el chart
                        String TipoActivo = LblTipoActivo.Text;
                        //Si ya se ha añadido los dos puntos, no se vuelven a añadir
                        if (!LblOpcion.Text.Contains(":"))
                        {
                            LblOpcion.Text = LblOpcion.Text + ":";
                        }
                        int IdTipoActivo = TiposActivosFactory.BuscarIdTipoActivo(TipoActivo);
                        ModeloContainer agenteBD = new ModeloContainer();
                        IQueryable<ActivosEmpresa> ActivosEmpresa = ActivosEmpresaFactory.ActivosEmpresaTipoActivo(EmpresaUsuario, IdTipoActivo);
                        List<ActivoConsultaAux> ListActivosAux = ActivoConsultaAux.RellenaValoresActivo(ActivosEmpresa);
                        GVActivosEmpresa.DataSource = ListActivosAux;
                        DataBind();
                        break;
                    case "ValorActivo":
                        //Recojo el valor del tipo de Valor Estratégico escogido en el chart (Bajo, Medio, Alto)
                        String ValorEstrategico = LblTipoActivo.Text;
                        //Si ya se ha añadido los dos puntos, no se vuelven a añadir
                        if (!LblOpcion.Text.Contains(":"))
                        {
                            LblOpcion.Text = LblOpcion.Text + ":";
                        }
                        int IdValorEstrategico = ActivosEmpresaFactory.RecogeIdValorEstrategico(ValorEstrategico);
                        LblTipoActivo.Text = ValorEstrategico;
                        IQueryable<ActivosEmpresa> ActivosEmpresaValorEstrat = ActivosEmpresaFactory.ActivosEmpresaValorEstrategico(EmpresaUsuario, IdValorEstrategico);
                        List<ActivoConsultaAux> ListActivosAuxVE = ActivoConsultaAux.RellenaValoresActivo(ActivosEmpresaValorEstrat);
                        GVActivosEmpresa.DataSource = ListActivosAuxVE;
                        DataBind();
                        break;
                    case "CosteActivo":
                        //Recojo el rango seleccionado en el chart
                        String LblRango = LblTipoActivo.Text;
                        int CosteActivo = 0;
                        //Si el coste elegido es superior a 1000000 de € avisamos con un valor de coste centinela
                        if (LblRango.Equals("> 1000000 €"))
                        {
                            CosteActivo = 1000001;
                        }
                        else
                        {
                            //Limpio el Rango para que sólo quede la cifra
                            int indice = LblRango.IndexOf('€');
                            String LblNumero = LblRango.Substring(1, (indice - 1));
                            String RangoElegido = LblNumero.Trim();
                            CosteActivo = int.Parse(RangoElegido);
                        }
                        LblOpcion.Text = LblOpcion.Text + ":";
                        List<int> Rangos = RecogeDdlRangos();
                        IQueryable<ActivosEmpresa> ActivosEmpresaCoste = ActivosEmpresaFactory.ActivosEmpresaCosteActivo(EmpresaUsuario, Rangos, CosteActivo);
                        List<ActivoConsultaAux> ListActivosAuxCA = ActivoConsultaAux.RellenaValoresActivo(ActivosEmpresaCoste);
                        GVActivosEmpresa.DataSource = ListActivosAuxCA;
                        DataBind();
                        break;
                }
                UpdatePanel3.Update();
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar los valores de la tabla");
            }
        }

        protected void BtnAplicar_Click(object sender, EventArgs e)
        {
            //Lanzamos el validador para ver que no hay dos rangos iguales elegidos y que hay, al menos, dos 
            //rangos seleccionados
            Page.Validate("ValidadorDdl");
            //Si se pasa el validador
            if (Page.IsValid)
            {
                //Recogemos los Rangos seleccionados en los Ddl
                List<int> Rangos = RecogeDdlRangos();
                //Pintamos el chart con los rangos seleccionados
                PintaChart("CosteActivo", Rangos);
            }
            //Si no se pasa el validador
            else
            {
                //Limpiamos el gridview para que no muestre nada
                GVActivosEmpresa.DataSource = null;
                DataBind();
                UpdatePanel3.Update();
                //Ponemos el Chart invisible
                Chart1.Visible = false;
                UpdatePanel2.Update();
            }

        }

        //Método privado que recoge los valores de los Ddl de los Rangos en la opción Coste de Activo
        private List<int> RecogeDdlRangos()
        {
            //Recogemos los valores de los Ddl
            List<int> Rangos = new List<int>();
            Rangos.Insert(0, int.Parse(DdlRng1.SelectedValue));
            Rangos.Insert(1, int.Parse(DdlRng2.SelectedValue));
            Rangos.Insert(2, int.Parse(DdlRng3.SelectedValue));
            Rangos.Insert(3, int.Parse(DdlRng4.SelectedValue));
            Rangos.Insert(4, int.Parse(DdlRng5.SelectedValue));
            try
            {
                //Ponemos los Ddl en negro si han pasado toda la validación de datos
                for (int i = 0; i < Rangos.Count; i++)
                {
                    MarcaDdlNormal(i);
                }
                for (int i = 4; i >= 0; i--)
                {
                    if (Rangos[i] == 0)
                    {
                        Rangos.RemoveAt(i);
                    }
                }
                Rangos.Sort();
                return Rangos;
            }
            catch (Exception e1)
            {
                e1.ToString();
                Rangos.Sort();
                return Rangos;
            }
        }

        //Método que sirve para dar formato a los rangos numéricos para mostrarlos en la interfaz
        private static List<String> RecogeRangos(List<int> Rangos)
        {
            List<String> ValoresRangos = new List<String>();
            for (int i = 0; i < Rangos.Count && Rangos[i] != 0; i++)
            {
                if (Rangos[i].Equals(1000001))
                {
                    String Rango = "> 1000000 €";
                    ValoresRangos.Insert(i, Rango);
                }
                else
                {
                    String Rango = "< " + Rangos[i].ToString() + " €";
                    ValoresRangos.Insert(i, Rango);
                }
            }
            return ValoresRangos;
        }

        //Validador de los Rangos. Asegura que los rangos han sido bien seleccionados
        protected void ValidadorRng_ServerValidate(object source, ServerValidateEventArgs args)
        {
            //Recogemos los Rangos del Ddl
            List<int> Rangos = new List<int>();
            Rangos.Insert(0, int.Parse(DdlRng1.SelectedValue));
            Rangos.Insert(1, int.Parse(DdlRng2.SelectedValue));
            Rangos.Insert(2, int.Parse(DdlRng3.SelectedValue));
            Rangos.Insert(3, int.Parse(DdlRng4.SelectedValue));
            Rangos.Insert(4, int.Parse(DdlRng5.SelectedValue));
            //Comprobamos que no se ha seleccionado ningún rango repetido
            for (int i = 0; i < Rangos.Count; i++)
            {
                for (int j = 0; j < Rangos.Count && j != i; j++)
                {
                    //Si hay dos rangos iguales
                    if (Rangos[i].Equals(Rangos[j]) && Rangos[i] != 0)
                    {
                        //Se marcan en rojo los Ddl
                        MarcaDdlError(i);
                        MarcaDdlError(j);
                        //Se invalida la validación y se muestra mensaje de error
                        args.IsValid = false;
                        MuestraMensaje("Se han elegido rangos que son iguales.Corríjalo y vuelva a intentarlo");
                        //Limpiamos el gridview para que no muestre nada
                        GVActivosEmpresa.DataSource = null;
                        DataBind();
                        UpdatePanel3.Update();
                    }
                }
            }
        }

        //Método para poner el contenido de los Ddl seleccionados con el índice en rojo, indicando que hay un error
        private void MarcaDdlError(int indice)
        {
            switch (indice)
            {
                case 0:
                    DdlRng1.ForeColor = Color.Red;
                    break;
                case 1:
                    DdlRng2.ForeColor = Color.Red;
                    break;
                case 2:
                    DdlRng3.ForeColor = Color.Red;
                    break;
                case 3:
                    DdlRng4.ForeColor = Color.Red;
                    break;
                case 4:
                    DdlRng5.ForeColor = Color.Red;
                    break;
            }
        }

        //Método para poner el contenido de los Ddl seleccionados con el índice en negro, por si se viene de un erro
        //y ya no existe
        private void MarcaDdlNormal(int indice)
        {
            switch (indice)
            {
                case 0:
                    DdlRng1.ForeColor = Color.Black;
                    break;
                case 1:
                    DdlRng2.ForeColor = Color.Black;
                    break;
                case 2:
                    DdlRng3.ForeColor = Color.Black;
                    break;
                case 3:
                    DdlRng4.ForeColor = Color.Black;
                    break;
                case 4:
                    DdlRng5.ForeColor = Color.Black;
                    break;
            }
        }

        //Método que comprueba que Ddl se han seleccionado con un parámetro índice para elegir un Ddl concreto
        private bool CompruebaDdl(int indice)
        {
            bool seleccionado = false;
            switch (indice)
            {
                case 0:
                    if (int.Parse(DdlRng1.SelectedValue) != 0)
                    {
                        seleccionado = true;
                    }
                    break;
                case 1:
                    if (int.Parse(DdlRng2.SelectedValue) != 0)
                    {
                        seleccionado = true;
                    }
                    break;
                case 2:
                    if (int.Parse(DdlRng3.SelectedValue) != 0)
                    {
                        seleccionado = true;
                    }
                    break;
                case 3:
                    if (int.Parse(DdlRng4.SelectedValue) != 0)
                    {
                        seleccionado = true;
                    }
                    break;
                case 4:
                    if (int.Parse(DdlRng5.SelectedValue) != 0)
                    {
                        seleccionado = true;
                    }
                    break;
                default:
                    seleccionado = false;
                    break;

            }
            return seleccionado;
        }

        protected void GVActivosEmpresa_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                //Recogemos la opción elegida en el DropDownList
                String opcion = DdlActivos.SelectedValue;
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                this.GVActivosEmpresa.PageIndex = e.NewPageIndex;
                //Si hubiera una fila seleccionada para editar la deseleccionamos
                GVActivosEmpresa.EditIndex = -1;
                //Recogemos el valor seleccionados en el chart: un Tipo de Activo o un Valor Estratégico
                String Parametro = LblTipoActivo.Text;
                //Si la opción elegida en el Ddl es Coste de Activo, tenemos que tener en cuenta los Rangos elegidos
                if (opcion.Equals("CosteActivo"))
                {
                    //Se recoge los rangos elegidos
                    List<int> Rangos = RecogeDdlRangos();
                    //Se pincha el Chart de acuerdo a esos rangos
                    //PintaChart(opcion, Rangos);
                    //Se llena el Gridview
                    LlenaGridView(opcion);
                }
                //Si no es la opción Coste de Activo, no existen rangos, luego no se tienen en cuenta
                else
                {
                    //PintaChart(opcion, null);
                    LlenaGridView(opcion);
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar la tabla con los elementos seleccionados\n");
            }
        }


    }
}